document.py 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047
  1. from django.utils.translation import gettext_lazy as _
  2. from drf_spectacular.utils import extend_schema
  3. from rest_framework.parsers import MultiPartParser
  4. from rest_framework.request import Request
  5. from rest_framework.views import APIView
  6. from common.auth import TokenAuth
  7. from common.auth.authentication import has_permissions
  8. from common.constants.permission_constants import PermissionConstants, RoleConstants, ViewPermission, CompareConstants
  9. from common.log.log import log
  10. from common.result import result
  11. from knowledge.api.document import DocumentSplitAPI, DocumentBatchAPI, DocumentBatchCreateAPI, DocumentCreateAPI, \
  12. DocumentReadAPI, DocumentEditAPI, DocumentDeleteAPI, TableDocumentCreateAPI, QaDocumentCreateAPI, \
  13. WebDocumentCreateAPI, CancelTaskAPI, BatchCancelTaskAPI, SyncWebAPI, RefreshAPI, BatchEditHitHandlingAPI, \
  14. DocumentTreeReadAPI, DocumentSplitPatternAPI, BatchRefreshAPI, BatchGenerateRelatedAPI, TemplateExportAPI, \
  15. DocumentExportAPI, DocumentMigrateAPI, DocumentDownloadSourceAPI, DocumentTagsAPI
  16. from knowledge.api.tag import DocsTagDeleteAPI
  17. from knowledge.serializers.common import get_knowledge_operation_object
  18. from knowledge.serializers.document import DocumentSerializers
  19. from knowledge.views.common import get_knowledge_document_operation_object, get_document_operation_object_batch, \
  20. get_document_operation_object
  21. class DocumentView(APIView):
  22. authentication_classes = [TokenAuth]
  23. @extend_schema(
  24. methods=['POST'],
  25. description=_('Create document'),
  26. summary=_('Create document'),
  27. operation_id=_('Create document'), # type: ignore
  28. request=DocumentCreateAPI.get_request(),
  29. parameters=DocumentCreateAPI.get_parameters(),
  30. responses=DocumentCreateAPI.get_response(),
  31. tags=[_('Knowledge Base/Documentation')] # type: ignore
  32. )
  33. @has_permissions(
  34. PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission(),
  35. PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_permission_workspace_manage_role(),
  36. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  37. ViewPermission([RoleConstants.USER.get_workspace_role()],
  38. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  39. )
  40. @log(menu='document', operate="Create document",
  41. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  42. get_knowledge_operation_object(keywords.get('knowledge_id')),
  43. {'name': r.data.get('name')}), )
  44. def post(self, request: Request, workspace_id: str, knowledge_id: str):
  45. return result.success(
  46. DocumentSerializers.Create(
  47. data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id},
  48. ).save(request.data))
  49. @extend_schema(
  50. methods=['GET'],
  51. description=_('Get document'),
  52. summary=_('Get document'),
  53. operation_id=_('Get document'), # type: ignore
  54. parameters=DocumentTreeReadAPI.get_parameters(),
  55. responses=DocumentTreeReadAPI.get_response(),
  56. tags=[_('Knowledge Base/Documentation')] # type: ignore
  57. )
  58. @has_permissions(
  59. PermissionConstants.KNOWLEDGE_DOCUMENT_READ.get_workspace_knowledge_permission(),
  60. PermissionConstants.KNOWLEDGE_DOCUMENT_READ.get_workspace_permission_workspace_manage_role(),
  61. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  62. ViewPermission([RoleConstants.USER.get_workspace_role()],
  63. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  64. )
  65. def get(self, request: Request, workspace_id: str, knowledge_id: str):
  66. raw_tags = request.query_params.getlist("tags[]")
  67. return result.success(DocumentSerializers.Query(
  68. data={
  69. 'workspace_id': workspace_id,
  70. 'knowledge_id': knowledge_id,
  71. 'folder_id': request.query_params.get('folder_id'),
  72. 'name': request.query_params.get('name'),
  73. 'tag': request.query_params.get('tag'),
  74. 'tag_exclude': request.query_params.get('tag_exclude'),
  75. 'tag_ids': [tag for tag in raw_tags if tag != 'NO_TAG'],
  76. 'no_tag': 'NO_TAG' in raw_tags,
  77. 'desc': request.query_params.get("desc"),
  78. 'user_id': request.query_params.get('user_id')
  79. }
  80. ).list())
  81. class Operate(APIView):
  82. authentication_classes = [TokenAuth]
  83. @extend_schema(
  84. description=_('Get document details'),
  85. summary=_('Get document details'),
  86. operation_id=_('Get document details'), # type: ignore
  87. parameters=DocumentReadAPI.get_parameters(),
  88. responses=DocumentReadAPI.get_response(),
  89. tags=[_('Knowledge Base/Documentation')] # type: ignore
  90. )
  91. @has_permissions(
  92. PermissionConstants.KNOWLEDGE_DOCUMENT_READ.get_workspace_knowledge_permission(),
  93. PermissionConstants.KNOWLEDGE_DOCUMENT_READ.get_workspace_permission_workspace_manage_role(),
  94. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  95. ViewPermission([RoleConstants.USER.get_workspace_role()],
  96. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  97. )
  98. def get(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  99. operate = DocumentSerializers.Operate(data={
  100. 'document_id': document_id, 'knowledge_id': knowledge_id, 'workspace_id': workspace_id
  101. })
  102. operate.is_valid(raise_exception=True)
  103. return result.success(operate.one())
  104. @extend_schema(
  105. description=_('Modify document'),
  106. summary=_('Modify document'),
  107. operation_id=_('Modify document'), # type: ignore
  108. parameters=DocumentEditAPI.get_parameters(),
  109. request=DocumentEditAPI.get_request(),
  110. responses=DocumentEditAPI.get_response(),
  111. tags=[_('Knowledge Base/Documentation')] # type: ignore
  112. )
  113. @has_permissions(
  114. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
  115. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(),
  116. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  117. ViewPermission([RoleConstants.USER.get_workspace_role()],
  118. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  119. )
  120. @log(
  121. menu='document', operate="Modify document",
  122. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  123. get_knowledge_operation_object(keywords.get('knowledge_id')),
  124. get_document_operation_object(keywords.get('document_id'))
  125. ),
  126. )
  127. def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  128. return result.success(DocumentSerializers.Operate(data={
  129. 'document_id': document_id, 'knowledge_id': knowledge_id, 'workspace_id': workspace_id
  130. }).edit(request.data, with_valid=True))
  131. @extend_schema(
  132. description=_('Delete document'),
  133. summary=_('Delete document'),
  134. operation_id=_('Delete document'), # type: ignore
  135. parameters=DocumentDeleteAPI.get_parameters(),
  136. responses=DocumentDeleteAPI.get_response(),
  137. tags=[_('Knowledge Base/Documentation')] # type: ignore
  138. )
  139. @has_permissions(
  140. PermissionConstants.KNOWLEDGE_DOCUMENT_DELETE.get_workspace_knowledge_permission(),
  141. PermissionConstants.KNOWLEDGE_DOCUMENT_DELETE.get_workspace_permission_workspace_manage_role(),
  142. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  143. ViewPermission([RoleConstants.USER.get_workspace_role()],
  144. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  145. )
  146. @log(
  147. menu='document', operate="Delete document",
  148. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  149. get_knowledge_operation_object(keywords.get('knowledge_id')),
  150. get_document_operation_object(keywords.get('document_id'))
  151. ),
  152. )
  153. def delete(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  154. operate = DocumentSerializers.Operate(data={
  155. 'document_id': document_id, 'knowledge_id': knowledge_id, 'workspace_id': workspace_id
  156. })
  157. operate.is_valid(raise_exception=True)
  158. return result.success(operate.delete())
  159. class Split(APIView):
  160. authentication_classes = [TokenAuth]
  161. parser_classes = [MultiPartParser]
  162. @extend_schema(
  163. methods=['POST'],
  164. description=_('Segmented document'),
  165. summary=_('Segmented document'),
  166. operation_id=_('Segmented document'), # type: ignore
  167. parameters=DocumentSplitAPI.get_parameters(),
  168. request=DocumentSplitAPI.get_request(),
  169. responses=DocumentSplitAPI.get_response(),
  170. tags=[_('Knowledge Base/Documentation')] # type: ignore
  171. )
  172. @has_permissions(
  173. PermissionConstants.KNOWLEDGE_DOCUMENT_READ.get_workspace_knowledge_permission(),
  174. PermissionConstants.KNOWLEDGE_DOCUMENT_READ.get_workspace_permission_workspace_manage_role(),
  175. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  176. ViewPermission([RoleConstants.USER.get_workspace_role()],
  177. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  178. )
  179. def post(self, request: Request, workspace_id: str, knowledge_id: str):
  180. split_data = {'file': request.FILES.getlist('file')}
  181. request_data = request.data
  182. if 'patterns' in request.data and request.data.get('patterns') is not None and len(
  183. request.data.get('patterns')) > 0:
  184. split_data.__setitem__('patterns', request_data.getlist('patterns'))
  185. if 'limit' in request.data:
  186. split_data.__setitem__('limit', request_data.get('limit'))
  187. if 'with_filter' in request.data:
  188. split_data.__setitem__('with_filter', request_data.get('with_filter'))
  189. return result.success(DocumentSerializers.Split(data={
  190. 'workspace_id': workspace_id,
  191. 'knowledge_id': knowledge_id,
  192. }).parse(split_data))
  193. class SplitPattern(APIView):
  194. authentication_classes = [TokenAuth]
  195. @extend_schema(
  196. summary=_('Get a list of segment IDs'),
  197. description=_('Get a list of segment IDs'),
  198. operation_id=_('Get a list of segment IDs'), # type: ignore
  199. parameters=DocumentSplitPatternAPI.get_parameters(),
  200. responses=DocumentSplitPatternAPI.get_response(),
  201. tags=[_('Knowledge Base/Documentation')] # type: ignore
  202. )
  203. def get(self, request: Request, workspace_id: str, knowledge_id: str):
  204. return result.success(DocumentSerializers.SplitPattern(
  205. data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
  206. ).list())
  207. class BatchEditHitHandling(APIView):
  208. authentication_classes = [TokenAuth]
  209. @extend_schema(
  210. methods=['PUT'],
  211. summary=_('Modify document hit processing methods in batches'),
  212. description=_('Modify document hit processing methods in batches'),
  213. operation_id=_('Modify document hit processing methods in batches'), # type: ignore
  214. request=BatchEditHitHandlingAPI.get_request(),
  215. parameters=BatchEditHitHandlingAPI.get_parameters(),
  216. responses=BatchEditHitHandlingAPI.get_response(),
  217. tags=[_('Knowledge Base/Documentation')] # type: ignore
  218. )
  219. @has_permissions(
  220. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
  221. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(),
  222. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  223. ViewPermission([RoleConstants.USER.get_workspace_role()],
  224. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  225. )
  226. @log(
  227. menu='document', operate="Modify document hit processing methods in batches",
  228. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  229. get_knowledge_operation_object(keywords.get('knowledge_id')),
  230. get_document_operation_object_batch(r.data.get('id_list'))),
  231. )
  232. def put(self, request: Request, workspace_id: str, knowledge_id: str):
  233. return result.success(DocumentSerializers.Batch(
  234. data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
  235. ).batch_edit_hit_handling(request.data))
  236. class SyncWeb(APIView):
  237. authentication_classes = [TokenAuth]
  238. @extend_schema(
  239. methods=['PUT'],
  240. description=_('Synchronize web site types'),
  241. summary=_('Synchronize web site types'),
  242. operation_id=_('Synchronize web site types'), # type: ignore
  243. parameters=SyncWebAPI.get_parameters(),
  244. request=SyncWebAPI.get_request(),
  245. responses=SyncWebAPI.get_response(),
  246. tags=[_('Knowledge Base/Documentation')] # type: ignore
  247. )
  248. @has_permissions(
  249. PermissionConstants.KNOWLEDGE_DOCUMENT_SYNC.get_workspace_knowledge_permission(),
  250. PermissionConstants.KNOWLEDGE_DOCUMENT_SYNC.get_workspace_permission_workspace_manage_role(),
  251. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  252. ViewPermission([RoleConstants.USER.get_workspace_role()],
  253. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  254. )
  255. @log(
  256. menu='document', operate="Synchronize web site types",
  257. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  258. get_knowledge_operation_object(keywords.get('knowledge_id')),
  259. get_document_operation_object(keywords.get('document_id'))
  260. ),
  261. )
  262. def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  263. return result.success(DocumentSerializers.Sync(
  264. data={'document_id': document_id, 'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
  265. ).sync())
  266. class Refresh(APIView):
  267. authentication_classes = [TokenAuth]
  268. @extend_schema(
  269. methods=['PUT'],
  270. summary=_('Refresh document vector library'),
  271. description=_('Refresh document vector library'),
  272. operation_id=_('Refresh document vector library'), # type: ignore
  273. parameters=RefreshAPI.get_parameters(),
  274. request=RefreshAPI.get_request(),
  275. responses=RefreshAPI.get_response(),
  276. tags=[_('Knowledge Base/Documentation')] # type: ignore
  277. )
  278. @has_permissions(
  279. PermissionConstants.KNOWLEDGE_DOCUMENT_VECTOR.get_workspace_knowledge_permission(),
  280. PermissionConstants.KNOWLEDGE_DOCUMENT_VECTOR.get_workspace_permission_workspace_manage_role(),
  281. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  282. ViewPermission([RoleConstants.USER.get_workspace_role()],
  283. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  284. )
  285. @log(
  286. menu='document', operate="Refresh document vector library",
  287. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  288. get_knowledge_operation_object(keywords.get('knowledge_id')),
  289. get_document_operation_object(keywords.get('document_id'))
  290. ),
  291. )
  292. def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  293. return result.success(DocumentSerializers.Operate(
  294. data={'document_id': document_id, 'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
  295. ).refresh(request.data.get('state_list')))
  296. class CancelTask(APIView):
  297. authentication_classes = [TokenAuth]
  298. @extend_schema(
  299. summary=_('Cancel task'),
  300. description=_('Cancel task'),
  301. operation_id=_('Cancel task'), # type: ignore
  302. parameters=CancelTaskAPI.get_parameters(),
  303. request=CancelTaskAPI.get_request(),
  304. responses=CancelTaskAPI.get_response(),
  305. tags=[_('Knowledge Base/Documentation')] # type: ignore
  306. )
  307. @has_permissions(
  308. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
  309. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(),
  310. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  311. ViewPermission([RoleConstants.USER.get_workspace_role()],
  312. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  313. )
  314. @log(
  315. menu='document', operate="Cancel task",
  316. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  317. get_knowledge_operation_object(keywords.get('knowledge_id')),
  318. get_document_operation_object(keywords.get('document_id'))
  319. ),
  320. )
  321. def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  322. return result.success(DocumentSerializers.Operate(
  323. data={'document_id': document_id, 'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
  324. ).cancel(request.data))
  325. class BatchCancelTask(APIView):
  326. authentication_classes = [TokenAuth]
  327. @extend_schema(
  328. summary=_('Cancel tasks in batches'),
  329. description=_('Cancel tasks in batches'),
  330. operation_id=_('Cancel tasks in batches'), # type: ignore
  331. parameters=BatchCancelTaskAPI.get_parameters(),
  332. request=BatchCancelTaskAPI.get_request(),
  333. responses=BatchCancelTaskAPI.get_response(),
  334. tags=[_('Knowledge Base/Documentation')] # type: ignore
  335. )
  336. @has_permissions(
  337. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
  338. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(),
  339. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  340. ViewPermission([RoleConstants.USER.get_workspace_role()],
  341. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  342. )
  343. @log(
  344. menu='document', operate="Cancel tasks in batches",
  345. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  346. get_knowledge_operation_object(keywords.get('knowledge_id')),
  347. get_document_operation_object_batch(r.data.get('id_list'))
  348. ),
  349. )
  350. def put(self, request: Request, workspace_id: str, knowledge_id: str):
  351. return result.success(DocumentSerializers.Batch(data={
  352. 'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
  353. ).batch_cancel(request.data))
  354. class BatchCreate(APIView):
  355. authentication_classes = [TokenAuth]
  356. @extend_schema(
  357. methods=['PUT'],
  358. description=_('Create documents in batches'),
  359. summary=_('Create documents in batches'),
  360. operation_id=_('Create documents in batches'), # type: ignore
  361. request=DocumentBatchCreateAPI.get_request(),
  362. parameters=DocumentBatchCreateAPI.get_parameters(),
  363. responses=DocumentBatchCreateAPI.get_response(),
  364. tags=[_('Knowledge Base/Documentation')] # type: ignore
  365. )
  366. @has_permissions(
  367. PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission(),
  368. PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_permission_workspace_manage_role(),
  369. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
  370. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(),
  371. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  372. ViewPermission([RoleConstants.USER.get_workspace_role()],
  373. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  374. )
  375. @log(
  376. menu='document', operate="Create documents in batches",
  377. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  378. get_knowledge_operation_object(keywords.get('knowledge_id')),
  379. {'name': f'[{",".join([document.get("name") for document in r.data])}]',
  380. 'document_list': r.data}),
  381. )
  382. def put(self, request: Request, workspace_id: str, knowledge_id: str):
  383. return result.success(DocumentSerializers.Batch(
  384. data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
  385. ).batch_save(request.data))
  386. class BatchSync(APIView):
  387. authentication_classes = [TokenAuth]
  388. @extend_schema(
  389. methods=['PUT'],
  390. description=_('Batch sync documents'),
  391. summary=_('Batch sync documents'),
  392. operation_id=_('Batch sync documents'), # type: ignore
  393. request=DocumentBatchAPI.get_request(),
  394. parameters=DocumentBatchAPI.get_parameters(),
  395. responses=DocumentBatchAPI.get_response(),
  396. tags=[_('Knowledge Base/Documentation')] # type: ignore
  397. )
  398. @has_permissions(
  399. PermissionConstants.KNOWLEDGE_DOCUMENT_SYNC.get_workspace_knowledge_permission(),
  400. PermissionConstants.KNOWLEDGE_DOCUMENT_SYNC.get_workspace_permission_workspace_manage_role(),
  401. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
  402. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(),
  403. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  404. ViewPermission([RoleConstants.USER.get_workspace_role()],
  405. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  406. )
  407. @log(
  408. menu='document', operate="Batch sync documents",
  409. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  410. get_knowledge_operation_object(keywords.get('knowledge_id')),
  411. get_document_operation_object_batch(r.data.get('id_list'))),
  412. )
  413. def put(self, request: Request, workspace_id: str, knowledge_id: str):
  414. return result.success(DocumentSerializers.Batch(
  415. data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
  416. ).batch_sync(request.data))
  417. class BatchDelete(APIView):
  418. authentication_classes = [TokenAuth]
  419. @extend_schema(
  420. methods=['PUT'],
  421. description=_('Delete documents in batches'),
  422. summary=_('Delete documents in batches'),
  423. operation_id=_('Delete documents in batches'), # type: ignore
  424. request=DocumentBatchAPI.get_request(),
  425. parameters=DocumentBatchAPI.get_parameters(),
  426. responses=DocumentBatchAPI.get_response(),
  427. tags=[_('Knowledge Base/Documentation')] # type: ignore
  428. )
  429. @has_permissions(
  430. PermissionConstants.KNOWLEDGE_DOCUMENT_DELETE.get_workspace_knowledge_permission(),
  431. PermissionConstants.KNOWLEDGE_DOCUMENT_DELETE.get_workspace_permission_workspace_manage_role(),
  432. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
  433. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(),
  434. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  435. ViewPermission([RoleConstants.USER.get_workspace_role()],
  436. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  437. )
  438. @log(
  439. menu='document', operate="Delete documents in batches",
  440. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  441. get_knowledge_operation_object(keywords.get('knowledge_id')),
  442. get_document_operation_object_batch(r.data.get('id_list'))),
  443. )
  444. def put(self, request: Request, workspace_id: str, knowledge_id: str):
  445. return result.success(DocumentSerializers.Batch(
  446. data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id}
  447. ).batch_delete(request.data))
  448. class BatchRefresh(APIView):
  449. authentication_classes = [TokenAuth]
  450. @extend_schema(
  451. methods=['PUT'],
  452. summary=_('Batch refresh document vector library'),
  453. operation_id=_('Batch refresh document vector library'), # type: ignore
  454. request=BatchRefreshAPI.get_request(),
  455. parameters=BatchRefreshAPI.get_parameters(),
  456. responses=BatchRefreshAPI.get_response(),
  457. tags=[_('Knowledge Base/Documentation')] # type: ignore
  458. )
  459. @has_permissions(
  460. PermissionConstants.KNOWLEDGE_DOCUMENT_VECTOR.get_workspace_knowledge_permission(),
  461. PermissionConstants.KNOWLEDGE_DOCUMENT_VECTOR.get_workspace_permission_workspace_manage_role(),
  462. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
  463. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(),
  464. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  465. ViewPermission([RoleConstants.USER.get_workspace_role()],
  466. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  467. )
  468. @log(
  469. menu='document', operate="Batch refresh document vector library",
  470. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  471. get_knowledge_operation_object(keywords.get('knowledge_id')),
  472. get_document_operation_object_batch(r.data.get('id_list'))
  473. ),
  474. )
  475. def put(self, request: Request, workspace_id: str, knowledge_id: str):
  476. return result.success(
  477. DocumentSerializers.Batch(
  478. data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id}
  479. ).batch_refresh(request.data))
  480. class BatchAddTag(APIView):
  481. authentication_classes = [TokenAuth]
  482. @extend_schema(
  483. methods=['POST'],
  484. summary=_('Batch add tags to documents'),
  485. operation_id=_('Batch add tags to documents'), # type: ignore
  486. request=DocumentTagsAPI.get_request(),
  487. parameters=DocumentTagsAPI.get_parameters(),
  488. responses=DocumentTagsAPI.get_response(),
  489. tags=[_('Knowledge Base/Documentation')] # type: ignore
  490. )
  491. @has_permissions(
  492. PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_knowledge_permission(),
  493. PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_permission_workspace_manage_role(),
  494. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  495. ViewPermission([RoleConstants.USER.get_workspace_role()],
  496. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  497. )
  498. @log(
  499. menu='document', operate="Batch add tags to documents",
  500. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  501. get_knowledge_operation_object(keywords.get('knowledge_id')),
  502. get_document_operation_object_batch(r.data.get('document_ids'))
  503. ),
  504. )
  505. def post(self, request: Request, workspace_id: str, knowledge_id: str):
  506. return result.success(DocumentSerializers.Batch(
  507. data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id}
  508. ).batch_add_tag(request.data))
  509. class BatchGenerateRelated(APIView):
  510. authentication_classes = [TokenAuth]
  511. @extend_schema(
  512. methods=['PUT'],
  513. summary=_('Batch generate related problems'),
  514. description=_('Batch generate related problems'),
  515. operation_id=_('Batch generate related problems'), # type: ignore
  516. request=BatchGenerateRelatedAPI.get_request(),
  517. parameters=BatchGenerateRelatedAPI.get_parameters(),
  518. responses=BatchGenerateRelatedAPI.get_response(),
  519. tags=[_('Knowledge Base/Documentation')] # type: ignore
  520. )
  521. @has_permissions(
  522. PermissionConstants.KNOWLEDGE_DOCUMENT_GENERATE.get_workspace_knowledge_permission(),
  523. PermissionConstants.KNOWLEDGE_DOCUMENT_GENERATE.get_workspace_permission_workspace_manage_role(),
  524. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
  525. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(),
  526. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  527. ViewPermission([RoleConstants.USER.get_workspace_role()],
  528. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  529. )
  530. @log(
  531. menu='document', operate="Batch generate related problems",
  532. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  533. get_knowledge_operation_object(keywords.get('knowledge_id')),
  534. get_document_operation_object_batch(r.data.get('document_id_list'))
  535. ),
  536. )
  537. def put(self, request: Request, workspace_id: str, knowledge_id: str):
  538. return result.success(DocumentSerializers.BatchGenerateRelated(
  539. data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id}
  540. ).batch_generate_related(request.data))
  541. class BatchExport(APIView):
  542. authentication_classes = [TokenAuth]
  543. @has_permissions(
  544. PermissionConstants.KNOWLEDGE_DOCUMENT_EXPORT.get_workspace_knowledge_permission(),
  545. PermissionConstants.KNOWLEDGE_DOCUMENT_EXPORT.get_workspace_permission_workspace_manage_role(),
  546. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  547. ViewPermission([RoleConstants.USER.get_workspace_role()],
  548. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  549. )
  550. @log(
  551. menu='document', operate="Export multiple document",
  552. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  553. get_knowledge_operation_object(keywords.get('knowledge_id')),
  554. get_document_operation_object(keywords.get('document_id'))
  555. ),
  556. )
  557. def post(self, request: Request, workspace_id: str, knowledge_id: str):
  558. return DocumentSerializers.Batch(data={
  559. 'workspace_id': workspace_id,
  560. 'knowledge_id': knowledge_id,
  561. 'user_id': request.user.id
  562. }).batch_export({'id_list': request.data})
  563. class BatchExportZip(APIView):
  564. authentication_classes = [TokenAuth]
  565. @has_permissions(
  566. PermissionConstants.KNOWLEDGE_DOCUMENT_EXPORT.get_workspace_knowledge_permission(),
  567. PermissionConstants.KNOWLEDGE_DOCUMENT_EXPORT.get_workspace_permission_workspace_manage_role(),
  568. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  569. ViewPermission([RoleConstants.USER.get_workspace_role()],
  570. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  571. )
  572. @log(
  573. menu='document', operate="Export multiple document",
  574. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  575. get_knowledge_operation_object(keywords.get('knowledge_id')),
  576. get_document_operation_object(keywords.get('document_id'))
  577. ),
  578. )
  579. def post(self, request: Request, workspace_id: str, knowledge_id: str):
  580. return DocumentSerializers.Batch(data={
  581. 'workspace_id': workspace_id,
  582. 'knowledge_id': knowledge_id,
  583. 'user_id': request.user.id
  584. }).batch_export_zip({'id_list': request.data})
  585. class Page(APIView):
  586. authentication_classes = [TokenAuth]
  587. @extend_schema(
  588. methods=['GET'],
  589. description=_('Get document by pagination'),
  590. summary=_('Get document by pagination'),
  591. operation_id=_('Get document by pagination'), # type: ignore
  592. parameters=DocumentTreeReadAPI.get_parameters(),
  593. responses=DocumentTreeReadAPI.get_response(),
  594. tags=[_('Knowledge Base/Documentation')] # type: ignore
  595. )
  596. @has_permissions(
  597. PermissionConstants.KNOWLEDGE_DOCUMENT_READ.get_workspace_knowledge_permission(),
  598. PermissionConstants.KNOWLEDGE_DOCUMENT_READ.get_workspace_permission_workspace_manage_role(),
  599. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  600. ViewPermission([RoleConstants.USER.get_workspace_role()],
  601. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  602. )
  603. def get(self, request: Request, workspace_id: str, knowledge_id: str, current_page: int, page_size: int):
  604. raw_tags = request.query_params.getlist("tags[]")
  605. return result.success(DocumentSerializers.Query(
  606. data={
  607. 'workspace_id': workspace_id,
  608. 'knowledge_id': knowledge_id,
  609. 'folder_id': request.query_params.get('folder_id'),
  610. 'name': request.query_params.get('name'),
  611. 'tag': request.query_params.get('tag'),
  612. 'tag_exclude': request.query_params.get('tag_exclude'),
  613. 'tag_ids': [tag for tag in raw_tags if tag != 'NO_TAG'],
  614. 'no_tag': 'NO_TAG' in raw_tags,
  615. 'desc': request.query_params.get("desc"),
  616. 'user_id': request.query_params.get('user_id'),
  617. 'status': request.query_params.get('status'),
  618. 'is_active': request.query_params.get('is_active'),
  619. 'hit_handling_method': request.query_params.get('hit_handling_method'),
  620. 'order_by': request.query_params.get('order_by'),
  621. }
  622. ).page(current_page, page_size))
  623. class Export(APIView):
  624. authentication_classes = [TokenAuth]
  625. @extend_schema(
  626. summary=_('Export document'),
  627. operation_id=_('Export document'), # type: ignore
  628. parameters=DocumentExportAPI.get_parameters(),
  629. responses=DocumentExportAPI.get_response(),
  630. tags=[_('Knowledge Base/Documentation')] # type: ignore
  631. )
  632. @has_permissions(
  633. PermissionConstants.KNOWLEDGE_DOCUMENT_EXPORT.get_workspace_knowledge_permission(),
  634. PermissionConstants.KNOWLEDGE_DOCUMENT_EXPORT.get_workspace_permission_workspace_manage_role(),
  635. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  636. ViewPermission([RoleConstants.USER.get_workspace_role()],
  637. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  638. )
  639. @log(
  640. menu='document', operate="Export document",
  641. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  642. get_knowledge_operation_object(keywords.get('knowledge_id')),
  643. get_document_operation_object(keywords.get('document_id'))
  644. ),
  645. )
  646. def get(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  647. return DocumentSerializers.Operate(data={
  648. 'workspace_id': workspace_id, 'document_id': document_id, 'knowledge_id': knowledge_id
  649. }).export()
  650. class ExportZip(APIView):
  651. authentication_classes = [TokenAuth]
  652. @extend_schema(
  653. summary=_('Export Zip document'),
  654. operation_id=_('Export Zip document'), # type: ignore
  655. parameters=DocumentExportAPI.get_parameters(),
  656. responses=DocumentExportAPI.get_response(),
  657. tags=[_('Knowledge Base/Documentation')] # type: ignore
  658. )
  659. @has_permissions(
  660. PermissionConstants.KNOWLEDGE_DOCUMENT_EXPORT.get_workspace_knowledge_permission(),
  661. PermissionConstants.KNOWLEDGE_DOCUMENT_EXPORT.get_workspace_permission_workspace_manage_role(),
  662. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  663. ViewPermission([RoleConstants.USER.get_workspace_role()],
  664. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  665. )
  666. @log(
  667. menu='document', operate="Export Zip document",
  668. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  669. get_knowledge_operation_object(keywords.get('knowledge_id')),
  670. get_document_operation_object(keywords.get('document_id'))
  671. ),
  672. )
  673. def get(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  674. return DocumentSerializers.Operate(data={
  675. 'workspace_id': workspace_id, 'document_id': document_id, 'knowledge_id': knowledge_id
  676. }).export_zip()
  677. class DownloadSourceFile(APIView):
  678. authentication_classes = [TokenAuth]
  679. @extend_schema(
  680. summary=_('Download source file'),
  681. operation_id=_('Download source file'), # type: ignore
  682. parameters=DocumentDownloadSourceAPI.get_parameters(),
  683. responses=DocumentDownloadSourceAPI.get_response(),
  684. tags=[_('Knowledge Base/Documentation')] # type: ignore
  685. )
  686. @has_permissions(
  687. PermissionConstants.KNOWLEDGE_DOCUMENT_DOWNLOAD_SOURCE_FILE.get_workspace_knowledge_permission(),
  688. PermissionConstants.KNOWLEDGE_DOCUMENT_DOWNLOAD_SOURCE_FILE.get_workspace_permission_workspace_manage_role(),
  689. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  690. ViewPermission([RoleConstants.USER.get_workspace_role()],
  691. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  692. )
  693. def get(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  694. return DocumentSerializers.Operate(data={
  695. 'workspace_id': workspace_id, 'document_id': document_id, 'knowledge_id': knowledge_id
  696. }).download_source_file()
  697. class ReplaceSourceFile(APIView):
  698. authentication_classes = [TokenAuth]
  699. @extend_schema(
  700. summary=_('Replace source file'),
  701. operation_id=_('Replace source file'), # type: ignore
  702. parameters=DocumentDownloadSourceAPI.get_parameters(),
  703. responses=DocumentDownloadSourceAPI.get_response(),
  704. tags=[_('Knowledge Base/Documentation')] # type: ignore
  705. )
  706. @has_permissions(
  707. PermissionConstants.KNOWLEDGE_DOCUMENT_REPLACE.get_workspace_knowledge_permission(),
  708. PermissionConstants.KNOWLEDGE_DOCUMENT_REPLACE.get_workspace_permission_workspace_manage_role(),
  709. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  710. ViewPermission([RoleConstants.USER.get_workspace_role()],
  711. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  712. )
  713. def post(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  714. return result.success(DocumentSerializers.ReplaceSourceFile(data={
  715. 'workspace_id': workspace_id,
  716. 'document_id': document_id,
  717. 'knowledge_id': knowledge_id,
  718. 'file': request.FILES.get('file')
  719. }).replace())
  720. class Tags(APIView):
  721. authentication_classes = [TokenAuth]
  722. @extend_schema(
  723. summary=_('Get document tags'),
  724. description=_('Get document tags'),
  725. operation_id=_('Get document tags'), # type: ignore
  726. parameters=DocumentTagsAPI.get_parameters(),
  727. responses=DocumentTagsAPI.get_response(),
  728. tags=[_('Knowledge Base/Documentation')] # type: ignore
  729. )
  730. @has_permissions(
  731. PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_knowledge_permission(),
  732. PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_permission_workspace_manage_role(),
  733. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  734. ViewPermission([RoleConstants.USER.get_workspace_role()],
  735. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  736. )
  737. def get(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  738. return result.success(DocumentSerializers.Tags(data={
  739. 'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'document_id': document_id,
  740. 'name': request.query_params.get('name')
  741. }).list())
  742. @extend_schema(
  743. summary=_('Add document tags'),
  744. description=_('Add document tags'),
  745. operation_id=_('Add document tags'), # type: ignore
  746. parameters=DocumentTagsAPI.get_parameters(),
  747. responses=DocumentTagsAPI.get_response(),
  748. tags=[_('Knowledge Base/Documentation')] # type: ignore
  749. )
  750. @has_permissions(
  751. PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_knowledge_permission(),
  752. PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_permission_workspace_manage_role(),
  753. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  754. ViewPermission([RoleConstants.USER.get_workspace_role()],
  755. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  756. )
  757. def post(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  758. return result.success(DocumentSerializers.AddTags(data={
  759. 'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'document_id': document_id,
  760. 'tag_ids': request.data
  761. }).add_tags())
  762. class BatchDelete(APIView):
  763. authentication_classes = [TokenAuth]
  764. @extend_schema(
  765. summary=_('Delete document tags'),
  766. description=_('Delete document tags'),
  767. operation_id=_('Delete document tags'), # type: ignore
  768. parameters=DocumentTagsAPI.get_parameters(),
  769. request=DocumentTagsAPI.get_request(),
  770. responses=DocumentTagsAPI.get_response(),
  771. tags=[_('Knowledge Base/Documentation')] # type: ignore
  772. )
  773. @has_permissions(
  774. PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_knowledge_permission(),
  775. PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_permission_workspace_manage_role(),
  776. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  777. ViewPermission([RoleConstants.USER.get_workspace_role()],
  778. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()],
  779. CompareConstants.AND),
  780. )
  781. @log(
  782. menu='document', operate="Delete document tags",
  783. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  784. get_knowledge_operation_object(keywords.get('knowledge_id')),
  785. get_document_operation_object(keywords.get('document_id'))
  786. ),
  787. )
  788. def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  789. return result.success(DocumentSerializers.DeleteTags(data={
  790. 'workspace_id': workspace_id,
  791. 'knowledge_id': knowledge_id,
  792. 'document_id': document_id,
  793. 'tag_ids': request.data
  794. }).delete_tags())
  795. class BatchDeleteDocsTag(APIView):
  796. authentication_classes = [TokenAuth]
  797. @extend_schema(
  798. summary=_("Batch Delete Documents Tag"),
  799. description=_("Batch Delete Documents Tag"),
  800. parameters=DocsTagDeleteAPI.get_parameters(),
  801. request=DocsTagDeleteAPI.get_request(),
  802. responses=DocsTagDeleteAPI.get_response(),
  803. tags=[_('Knowledge Base/Tag')] # type: ignore
  804. )
  805. @has_permissions(
  806. PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_knowledge_permission(),
  807. PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_permission_workspace_manage_role(),
  808. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  809. ViewPermission([RoleConstants.USER.get_workspace_role()],
  810. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()],
  811. CompareConstants.AND),
  812. )
  813. @log(
  814. menu='tag', operate="Batch Delete Documents Tag",
  815. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  816. get_knowledge_operation_object(keywords.get('knowledge_id')),
  817. get_document_operation_object_batch(r.data.get('id_list'))),
  818. )
  819. def put(self, request: Request, workspace_id: str, knowledge_id: str, tag_id: str):
  820. return result.success(DocumentSerializers.DeleteDocsTag(data={
  821. 'workspace_id': workspace_id,
  822. 'knowledge_id': knowledge_id,
  823. 'tag_id': tag_id,
  824. }).batch_delete_docs_tag(request.data))
  825. class Migrate(APIView):
  826. authentication_classes = [TokenAuth]
  827. @extend_schema(
  828. summary=_('Migrate documents in batches'),
  829. operation_id=_('Migrate documents in batches'), # type: ignore
  830. parameters=DocumentMigrateAPI.get_parameters(),
  831. request=DocumentMigrateAPI.get_request(),
  832. responses=DocumentMigrateAPI.get_response(),
  833. tags=[_('Knowledge Base/Documentation')] # type: ignore
  834. )
  835. @has_permissions(
  836. PermissionConstants.KNOWLEDGE_DOCUMENT_MIGRATE.get_workspace_knowledge_permission(),
  837. PermissionConstants.KNOWLEDGE_DOCUMENT_MIGRATE.get_workspace_permission_workspace_manage_role(),
  838. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  839. ViewPermission([RoleConstants.USER.get_workspace_role()],
  840. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  841. )
  842. @log(
  843. menu='document', operate="Migrate documents in batches",
  844. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  845. get_knowledge_operation_object(keywords.get('knowledge_id')),
  846. get_document_operation_object_batch(r.data)
  847. ),
  848. )
  849. def put(self, request: Request, workspace_id, knowledge_id: str, target_knowledge_id: str):
  850. return result.success(DocumentSerializers.Migrate(
  851. data={
  852. 'workspace_id': workspace_id,
  853. 'knowledge_id': knowledge_id,
  854. 'target_knowledge_id': target_knowledge_id,
  855. 'document_id_list': request.data}
  856. ).migrate())
  857. class WebDocumentView(APIView):
  858. authentication_classes = [TokenAuth]
  859. @extend_schema(
  860. methods=['POST'],
  861. description=_('Create Web site documents'),
  862. summary=_('Create Web site documents'),
  863. operation_id=_('Create Web site documents'), # type: ignore
  864. request=WebDocumentCreateAPI.get_request(),
  865. parameters=WebDocumentCreateAPI.get_parameters(),
  866. responses=WebDocumentCreateAPI.get_response(),
  867. tags=[_('Knowledge Base/Documentation')] # type: ignore
  868. )
  869. @has_permissions(
  870. PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission(),
  871. PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_permission_workspace_manage_role(),
  872. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  873. ViewPermission([RoleConstants.USER.get_workspace_role()],
  874. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  875. )
  876. @log(
  877. menu='document', operate="Create Web site documents",
  878. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  879. get_knowledge_operation_object(keywords.get('knowledge_id')),
  880. {'name': f'[{",".join([url for url in r.data.get("source_url_list", [])])}]',
  881. 'document_list': [{'name': url} for url in r.data.get("source_url_list", [])]}),
  882. )
  883. def post(self, request: Request, workspace_id: str, knowledge_id: str):
  884. return result.success(DocumentSerializers.Create(data={
  885. 'knowledge_id': knowledge_id, 'workspace_id': workspace_id
  886. }).save_web(request.data, with_valid=True))
  887. class QaDocumentView(APIView):
  888. authentication_classes = [TokenAuth]
  889. parser_classes = [MultiPartParser]
  890. @extend_schema(
  891. summary=_('Import QA and create documentation'),
  892. description=_('Import QA and create documentation'),
  893. operation_id=_('Import QA and create documentation'), # type: ignore
  894. request=QaDocumentCreateAPI.get_request(),
  895. parameters=QaDocumentCreateAPI.get_parameters(),
  896. responses=QaDocumentCreateAPI.get_response(),
  897. tags=[_('Knowledge Base/Documentation')] # type: ignore
  898. )
  899. @has_permissions(
  900. PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission(),
  901. PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_permission_workspace_manage_role(),
  902. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  903. ViewPermission([RoleConstants.USER.get_workspace_role()],
  904. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  905. )
  906. @log(
  907. menu='document', operate="Import QA and create documentation",
  908. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  909. get_knowledge_operation_object(keywords.get('knowledge_id')),
  910. {'name': f'[{",".join([file.name for file in r.FILES.getlist("file")])}]',
  911. 'document_list': [{'name': file.name} for file in r.FILES.getlist("file")]}),
  912. )
  913. def post(self, request: Request, workspace_id: str, knowledge_id: str):
  914. return result.success(DocumentSerializers.Create(data={
  915. 'knowledge_id': knowledge_id, 'workspace_id': workspace_id
  916. }).save_qa({'file_list': request.FILES.getlist('file')}, with_valid=True))
  917. class TableDocumentView(APIView):
  918. authentication_classes = [TokenAuth]
  919. parser_classes = [MultiPartParser]
  920. @extend_schema(
  921. summary=_('Import tables and create documents'),
  922. description=_('Import tables and create documents'),
  923. operation_id=_('Import tables and create documents'), # type: ignore
  924. request=TableDocumentCreateAPI.get_request(),
  925. parameters=TableDocumentCreateAPI.get_parameters(),
  926. responses=TableDocumentCreateAPI.get_response(),
  927. tags=[_('Knowledge Base/Documentation')] # type: ignore
  928. )
  929. @has_permissions(
  930. PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission(),
  931. PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_permission_workspace_manage_role(),
  932. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  933. ViewPermission([RoleConstants.USER.get_workspace_role()],
  934. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  935. )
  936. @log(
  937. menu='document', operate="Import tables and create documents",
  938. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  939. get_knowledge_operation_object(keywords.get('knowledge_id')),
  940. {'name': f'[{",".join([file.name for file in r.FILES.getlist("file")])}]',
  941. 'document_list': [{'name': file.name} for file in r.FILES.getlist("file")]}),
  942. )
  943. def post(self, request: Request, workspace_id: str, knowledge_id: str):
  944. return result.success(DocumentSerializers.Create(
  945. data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
  946. ).save_table({'file_list': request.FILES.getlist('file')}, with_valid=True))
  947. class Template(APIView):
  948. authentication_classes = [TokenAuth]
  949. @extend_schema(
  950. summary=_('Get QA template'),
  951. operation_id=_('Get QA template'), # type: ignore
  952. parameters=TemplateExportAPI.get_parameters(),
  953. responses=TemplateExportAPI.get_response(),
  954. tags=[_('Knowledge Base/Documentation')] # type: ignore
  955. )
  956. def get(self, request: Request):
  957. return DocumentSerializers.Export(data={'type': request.query_params.get('type')}).export(with_valid=True)
  958. class TableTemplate(APIView):
  959. authentication_classes = [TokenAuth]
  960. @extend_schema(
  961. summary=_('Get form template'),
  962. operation_id=_('Get form template'), # type: ignore
  963. parameters=TemplateExportAPI.get_parameters(),
  964. responses=TemplateExportAPI.get_response(),
  965. tags=[_('Knowledge Base/Documentation')]) # type: ignore
  966. def get(self, request: Request):
  967. return DocumentSerializers.Export(data={'type': request.query_params.get('type')}).table_export(with_valid=True)