paragraph.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. from django.utils.translation import gettext_lazy as _
  2. from drf_spectacular.utils import extend_schema
  3. from rest_framework.views import APIView
  4. from rest_framework.views import Request
  5. from common.auth import TokenAuth
  6. from common.auth.authentication import has_permissions
  7. from common.constants.permission_constants import PermissionConstants, RoleConstants, ViewPermission, CompareConstants
  8. from common.log.log import log
  9. from common.result import result
  10. from common.utils.common import query_params_to_single_dict
  11. from knowledge.api.paragraph import ParagraphReadAPI, ParagraphCreateAPI, ParagraphBatchDeleteAPI, ParagraphEditAPI, \
  12. ParagraphGetAPI, ProblemCreateAPI, UnAssociationAPI, AssociationAPI, ParagraphPageAPI, \
  13. ParagraphBatchGenerateRelatedAPI, ParagraphMigrateAPI, ParagraphAdjustOrderAPI
  14. from knowledge.serializers.common import get_knowledge_operation_object
  15. from knowledge.serializers.paragraph import ParagraphSerializers
  16. from knowledge.views import get_knowledge_document_operation_object, get_document_operation_object
  17. class ParagraphView(APIView):
  18. authentication_classes = [TokenAuth]
  19. @extend_schema(
  20. summary=_('Paragraph list'),
  21. description=_('Paragraph list'),
  22. operation_id=_('Paragraph list'), # type: ignore
  23. parameters=ParagraphReadAPI.get_parameters(),
  24. responses=ParagraphReadAPI.get_response(),
  25. tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
  26. )
  27. @has_permissions(
  28. PermissionConstants.KNOWLEDGE_DOCUMENT_READ.get_workspace_knowledge_permission(),
  29. PermissionConstants.KNOWLEDGE_DOCUMENT_READ.get_workspace_permission_workspace_manage_role(),
  30. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  31. ViewPermission([RoleConstants.USER.get_workspace_role()],
  32. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  33. )
  34. def get(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  35. q = ParagraphSerializers.Query(
  36. data={
  37. **query_params_to_single_dict(request.query_params),
  38. 'workspace_id': workspace_id,
  39. 'knowledge_id': knowledge_id,
  40. 'document_id': document_id
  41. }
  42. )
  43. return result.success(q.list())
  44. @extend_schema(
  45. summary=_('Create Paragraph'),
  46. operation_id=_('Create Paragraph'), # type: ignore
  47. parameters=ParagraphCreateAPI.get_parameters(),
  48. request=ParagraphCreateAPI.get_request(),
  49. responses=ParagraphCreateAPI.get_response(),
  50. tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
  51. )
  52. @has_permissions(
  53. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
  54. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(),
  55. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  56. ViewPermission([RoleConstants.USER.get_workspace_role()],
  57. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  58. )
  59. @log(
  60. menu='Paragraph', operate='Create Paragraph',
  61. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  62. get_knowledge_operation_object(keywords.get('knowledge_id')),
  63. get_knowledge_operation_object(keywords.get('knowledge_id')),
  64. get_document_operation_object(keywords.get('document_id'))
  65. ),
  66. )
  67. def post(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  68. return result.success(ParagraphSerializers.Create(
  69. data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'document_id': document_id}
  70. ).save(request.data))
  71. class BatchDelete(APIView):
  72. authentication_classes = [TokenAuth]
  73. @extend_schema(
  74. methods=['PUT'],
  75. summary=_('Batch Paragraph'),
  76. description=_('Batch Paragraph'),
  77. operation_id=_('Batch Paragraph'), # type: ignore
  78. parameters=ParagraphBatchDeleteAPI.get_parameters(),
  79. request=ParagraphBatchDeleteAPI.get_request(),
  80. responses=ParagraphBatchDeleteAPI.get_response(),
  81. tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
  82. )
  83. @has_permissions(
  84. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
  85. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(),
  86. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  87. ViewPermission([RoleConstants.USER.get_workspace_role()],
  88. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  89. )
  90. def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  91. return result.success(ParagraphSerializers.Batch(
  92. data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'document_id': document_id}
  93. ).batch_delete(request.data))
  94. class BatchMigrate(APIView):
  95. authentication_classes = [TokenAuth]
  96. @extend_schema(
  97. summary=_('Migrate paragraphs in batches'),
  98. operation_id=_('Migrate paragraphs in batches'), # type: ignore
  99. parameters=ParagraphMigrateAPI.get_parameters(),
  100. request=ParagraphMigrateAPI.get_request(),
  101. responses=ParagraphMigrateAPI.get_response(),
  102. tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
  103. )
  104. @has_permissions(
  105. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
  106. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(),
  107. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  108. ViewPermission([RoleConstants.USER.get_workspace_role()],
  109. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  110. )
  111. @log(
  112. menu='Paragraph', operate='Migrate paragraphs in batches',
  113. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  114. get_knowledge_operation_object(keywords.get('knowledge_id')),
  115. get_document_operation_object(keywords.get('document_id'))
  116. ),
  117. )
  118. def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str,
  119. target_knowledge_id: str, target_document_id):
  120. return result.success(
  121. ParagraphSerializers.Migrate(data={
  122. 'workspace_id': workspace_id,
  123. 'knowledge_id': knowledge_id,
  124. 'target_knowledge_id': target_knowledge_id,
  125. 'document_id': document_id,
  126. 'target_document_id': target_document_id,
  127. 'paragraph_id_list': request.data.get('id_list')
  128. }).migrate())
  129. class BatchGenerateRelated(APIView):
  130. authentication_classes = [TokenAuth]
  131. @extend_schema(
  132. methods=['PUT'],
  133. summary=_('Batch Generate Related'),
  134. description=_('Batch Generate Related'),
  135. operation_id=_('Batch Generate Related'), # type: ignore
  136. parameters=ParagraphBatchGenerateRelatedAPI.get_parameters(),
  137. request=ParagraphBatchGenerateRelatedAPI.get_request(),
  138. responses=ParagraphBatchGenerateRelatedAPI.get_response(),
  139. tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
  140. )
  141. @has_permissions(
  142. PermissionConstants.KNOWLEDGE_DOCUMENT_GENERATE.get_workspace_knowledge_permission(),
  143. PermissionConstants.KNOWLEDGE_DOCUMENT_GENERATE.get_workspace_permission_workspace_manage_role(),
  144. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  145. ViewPermission([RoleConstants.USER.get_workspace_role()],
  146. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  147. )
  148. @log(
  149. menu='Paragraph', operate='Batch generate related',
  150. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  151. get_knowledge_operation_object(keywords.get('knowledge_id')),
  152. get_document_operation_object(keywords.get('document_id'))
  153. ),
  154. )
  155. def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  156. return result.success(ParagraphSerializers.Batch(
  157. data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id, 'document_id': document_id}
  158. ).batch_generate_related(request.data))
  159. class Operate(APIView):
  160. authentication_classes = [TokenAuth]
  161. @extend_schema(
  162. methods=['PUT'],
  163. summary=_('Modify paragraph data'),
  164. description=_('Modify paragraph data'),
  165. operation_id=_('Modify paragraph data'), # type: ignore
  166. parameters=ParagraphEditAPI.get_parameters(),
  167. request=ParagraphEditAPI.get_request(),
  168. responses=ParagraphEditAPI.get_response(),
  169. tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
  170. )
  171. @has_permissions(
  172. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
  173. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(),
  174. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  175. ViewPermission([RoleConstants.USER.get_workspace_role()],
  176. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  177. )
  178. @log(
  179. menu='Paragraph', operate='Modify paragraph data',
  180. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  181. get_knowledge_operation_object(keywords.get('knowledge_id')),
  182. get_document_operation_object(keywords.get('document_id'))
  183. ),
  184. )
  185. def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str, paragraph_id: str):
  186. o = ParagraphSerializers.Operate(
  187. data={
  188. 'workspace_id': workspace_id,
  189. "paragraph_id": paragraph_id,
  190. 'knowledge_id': knowledge_id,
  191. 'document_id': document_id
  192. }
  193. )
  194. o.is_valid(raise_exception=True)
  195. return result.success(o.edit(request.data))
  196. @extend_schema(
  197. methods=['GET'],
  198. summary=_('Get paragraph details'),
  199. description=_('Get paragraph details'),
  200. operation_id=_('Get paragraph details'), # type: ignore
  201. parameters=ParagraphGetAPI.get_parameters(),
  202. responses=ParagraphGetAPI.get_response(),
  203. tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
  204. )
  205. @has_permissions(
  206. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
  207. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(),
  208. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  209. ViewPermission([RoleConstants.USER.get_workspace_role()],
  210. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  211. )
  212. def get(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str, paragraph_id: str):
  213. o = ParagraphSerializers.Operate(
  214. data={
  215. 'workspace_id': workspace_id,
  216. "paragraph_id": paragraph_id,
  217. 'knowledge_id': knowledge_id,
  218. 'document_id': document_id
  219. }
  220. )
  221. o.is_valid(raise_exception=True)
  222. return result.success(o.one())
  223. @extend_schema(
  224. methods=['DELETE'],
  225. summary=_('Delete paragraph'),
  226. description=_('Delete paragraph'),
  227. operation_id=_('Delete paragraph'), # type: ignore
  228. parameters=ParagraphGetAPI.get_parameters(),
  229. responses=ParagraphGetAPI.get_response(),
  230. tags=[_('Knowledge Base/Documentation/Paragraph')]) # type: ignore
  231. @has_permissions(
  232. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
  233. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(),
  234. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  235. ViewPermission([RoleConstants.USER.get_workspace_role()],
  236. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  237. )
  238. @log(
  239. menu='Paragraph', operate='Delete paragraph',
  240. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  241. get_knowledge_operation_object(keywords.get('knowledge_id')),
  242. get_document_operation_object(keywords.get('document_id'))
  243. ),
  244. )
  245. def delete(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str, paragraph_id: str):
  246. o = ParagraphSerializers.Operate(
  247. data={
  248. 'workspace_id': workspace_id,
  249. "paragraph_id": paragraph_id,
  250. 'knowledge_id': knowledge_id,
  251. 'document_id': document_id
  252. }
  253. )
  254. o.is_valid(raise_exception=True)
  255. return result.success(o.delete())
  256. class Problem(APIView):
  257. authentication_classes = [TokenAuth]
  258. @extend_schema(
  259. methods=['POST'],
  260. summary=_('Add associated questions'),
  261. description=_('Add associated questions'),
  262. operation_id=_('Add associated questions'), # type: ignore
  263. parameters=ProblemCreateAPI.get_parameters(),
  264. request=ProblemCreateAPI.get_request(),
  265. responses=ProblemCreateAPI.get_response(),
  266. tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
  267. )
  268. @has_permissions(
  269. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
  270. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(),
  271. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  272. ViewPermission([RoleConstants.USER.get_workspace_role()],
  273. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  274. )
  275. @log(
  276. menu='Paragraph', operate='Add associated questions',
  277. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  278. get_knowledge_operation_object(keywords.get('knowledge_id')),
  279. get_document_operation_object(keywords.get('document_id'))
  280. ),
  281. )
  282. def post(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str, paragraph_id: str):
  283. return result.success(ParagraphSerializers.Problem(
  284. data={
  285. 'workspace_id': workspace_id,
  286. "knowledge_id": knowledge_id,
  287. 'document_id': document_id,
  288. 'paragraph_id': paragraph_id
  289. }
  290. ).save(request.data, with_valid=True))
  291. @extend_schema(
  292. methods=['GET'],
  293. summary=_('Get a list of paragraph questions'),
  294. description=_('Get a list of paragraph questions'),
  295. operation_id=_('Get a list of paragraph questions'), # type: ignore
  296. parameters=ParagraphGetAPI.get_parameters(),
  297. responses=ParagraphGetAPI.get_response(),
  298. tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
  299. )
  300. @has_permissions(
  301. PermissionConstants.KNOWLEDGE_PROBLEM_READ.get_workspace_knowledge_permission(),
  302. PermissionConstants.KNOWLEDGE_PROBLEM_READ.get_workspace_permission_workspace_manage_role(),
  303. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  304. ViewPermission([RoleConstants.USER.get_workspace_role()],
  305. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  306. )
  307. def get(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str, paragraph_id: str):
  308. return result.success(ParagraphSerializers.Problem(
  309. data={
  310. 'workspace_id': workspace_id,
  311. "knowledge_id": knowledge_id,
  312. 'document_id': document_id,
  313. 'paragraph_id': paragraph_id
  314. }
  315. ).list(with_valid=True))
  316. class UnAssociation(APIView):
  317. authentication_classes = [TokenAuth]
  318. @extend_schema(
  319. methods=['PUT'],
  320. summary=_('Disassociation issue'),
  321. description=_('Disassociation issue'),
  322. operation_id=_('Disassociation issue'), # type: ignore
  323. parameters=UnAssociationAPI.get_parameters(),
  324. request=UnAssociationAPI.get_request(),
  325. responses=UnAssociationAPI.get_response(),
  326. tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
  327. )
  328. @has_permissions(
  329. PermissionConstants.KNOWLEDGE_PROBLEM_RELATE.get_workspace_knowledge_permission(),
  330. PermissionConstants.KNOWLEDGE_PROBLEM_RELATE.get_workspace_permission_workspace_manage_role(),
  331. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  332. ViewPermission([RoleConstants.USER.get_workspace_role()],
  333. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  334. )
  335. @log(
  336. menu='Paragraph', operate='Disassociation issue',
  337. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  338. get_knowledge_operation_object(keywords.get('knowledge_id')),
  339. get_document_operation_object(keywords.get('document_id'))
  340. )
  341. )
  342. def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  343. return result.success(ParagraphSerializers.Association(
  344. data={
  345. 'workspace_id': workspace_id,
  346. 'knowledge_id': knowledge_id,
  347. 'document_id': document_id,
  348. 'paragraph_id': request.query_params.get('paragraph_id'),
  349. 'problem_id': request.query_params.get('problem_id')
  350. }
  351. ).un_association())
  352. class Association(APIView):
  353. authentication_classes = [TokenAuth]
  354. @extend_schema(
  355. methods=['PUT'],
  356. summary=_('Related questions'),
  357. description=_('Related questions'),
  358. operation_id=_('Related questions'), # type: ignore
  359. parameters=AssociationAPI.get_parameters(),
  360. request=AssociationAPI.get_request(),
  361. responses=AssociationAPI.get_response(),
  362. tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
  363. )
  364. @has_permissions(
  365. PermissionConstants.KNOWLEDGE_PROBLEM_RELATE.get_workspace_knowledge_permission(),
  366. PermissionConstants.KNOWLEDGE_PROBLEM_RELATE.get_workspace_permission_workspace_manage_role(),
  367. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  368. ViewPermission([RoleConstants.USER.get_workspace_role()],
  369. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  370. )
  371. @log(
  372. menu='Paragraph', operate='Related questions',
  373. get_operation_object=lambda r, keywords: get_knowledge_document_operation_object(
  374. get_knowledge_operation_object(keywords.get('knowledge_id')),
  375. get_document_operation_object(keywords.get('document_id'))
  376. ),
  377. )
  378. def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  379. return result.success(ParagraphSerializers.Association(
  380. data={
  381. 'workspace_id': workspace_id,
  382. 'knowledge_id': knowledge_id,
  383. 'document_id': document_id,
  384. 'paragraph_id': request.query_params.get('paragraph_id'),
  385. 'problem_id': request.query_params.get('problem_id')
  386. }
  387. ).association())
  388. class Page(APIView):
  389. authentication_classes = [TokenAuth]
  390. @extend_schema(
  391. methods=['GET'],
  392. summary=_('Get paragraph list by pagination'),
  393. description=_('Get paragraph list by pagination'),
  394. operation_id=_('Get paragraph list by pagination'), # type: ignore
  395. parameters=ParagraphPageAPI.get_parameters(),
  396. responses=ParagraphPageAPI.get_response(),
  397. tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
  398. )
  399. @has_permissions(
  400. PermissionConstants.KNOWLEDGE_DOCUMENT_READ.get_workspace_knowledge_permission(),
  401. PermissionConstants.KNOWLEDGE_DOCUMENT_READ.get_workspace_permission_workspace_manage_role(),
  402. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  403. ViewPermission([RoleConstants.USER.get_workspace_role()],
  404. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  405. )
  406. def get(self, request: Request,
  407. workspace_id: str, knowledge_id: str, document_id: str, current_page: int, page_size: int):
  408. d = ParagraphSerializers.Query(
  409. data={
  410. **query_params_to_single_dict(request.query_params),
  411. 'workspace_id': workspace_id,
  412. 'knowledge_id': knowledge_id,
  413. 'document_id': document_id
  414. }
  415. )
  416. return result.success(d.page(current_page, page_size))
  417. class AdjustPosition(APIView):
  418. authentication_classes = [TokenAuth]
  419. @extend_schema(
  420. methods=['PUT'],
  421. summary=_('Adjust paragraph position'),
  422. description=_('Adjust paragraph position'),
  423. operation_id=_('Adjust paragraph position'), # type: ignore
  424. parameters=ParagraphAdjustOrderAPI.get_parameters(),
  425. request=ParagraphAdjustOrderAPI.get_request(),
  426. responses=ParagraphAdjustOrderAPI.get_response(),
  427. tags=[_('Knowledge Base/Documentation/Paragraph')] # type: ignore
  428. )
  429. @has_permissions(
  430. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(),
  431. PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(),
  432. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  433. ViewPermission([RoleConstants.USER.get_workspace_role()],
  434. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  435. )
  436. def put(self, request: Request, workspace_id: str, knowledge_id: str, document_id: str):
  437. return result.success(ParagraphSerializers.AdjustPosition(
  438. data={
  439. 'workspace_id': workspace_id,
  440. 'knowledge_id': knowledge_id,
  441. 'document_id': document_id,
  442. 'paragraph_id': request.query_params.get('paragraph_id'),
  443. }
  444. ).adjust_position(request.query_params.get('new_position')))