problem.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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.problem import ProblemReadAPI, ProblemBatchCreateAPI, BatchAssociationAPI, BatchDeleteAPI, \
  12. ProblemPageAPI, ProblemDeleteAPI, ProblemEditAPI, ProblemParagraphAPI
  13. from knowledge.serializers.common import get_knowledge_operation_object
  14. from knowledge.serializers.problem import ProblemSerializers
  15. class ProblemView(APIView):
  16. authentication_classes = [TokenAuth]
  17. @extend_schema(
  18. methods=['GET'],
  19. summary=_('Question list'),
  20. description=_('Question list'),
  21. operation_id=_('Question list'), # type: ignore
  22. parameters=ProblemReadAPI.get_parameters(),
  23. responses=ProblemReadAPI.get_response(),
  24. tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore
  25. )
  26. @has_permissions(
  27. PermissionConstants.KNOWLEDGE_PROBLEM_READ.get_workspace_knowledge_permission(),
  28. PermissionConstants.KNOWLEDGE_PROBLEM_READ.get_workspace_permission_workspace_manage_role(),
  29. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  30. ViewPermission([RoleConstants.USER.get_workspace_role()],
  31. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  32. )
  33. def get(self, request: Request, workspace_id: str, knowledge_id: str):
  34. q = ProblemSerializers.Query(
  35. data={
  36. **query_params_to_single_dict(request.query_params),
  37. 'workspace_id': workspace_id,
  38. 'knowledge_id': knowledge_id
  39. }
  40. )
  41. q.is_valid(raise_exception=True)
  42. return result.success(q.list())
  43. @extend_schema(
  44. methods=['POST'],
  45. summary=_('Create question'),
  46. description=_('Create question'),
  47. operation_id=_('Create question'), # type: ignore
  48. parameters=ProblemBatchCreateAPI.get_parameters(),
  49. responses=ProblemBatchCreateAPI.get_response(),
  50. request=ProblemBatchCreateAPI.get_request(),
  51. tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore
  52. )
  53. @has_permissions(
  54. PermissionConstants.KNOWLEDGE_PROBLEM_CREATE.get_workspace_knowledge_permission(),
  55. PermissionConstants.KNOWLEDGE_PROBLEM_CREATE.get_workspace_permission_workspace_manage_role(),
  56. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  57. ViewPermission([RoleConstants.USER.get_workspace_role()],
  58. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  59. )
  60. @log(
  61. menu='problem', operate='Create question',
  62. get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id'))
  63. ,
  64. )
  65. def post(self, request: Request, workspace_id: str, knowledge_id: str):
  66. return result.success(ProblemSerializers.Create(
  67. data={'workspace_id': workspace_id, 'knowledge_id': knowledge_id}
  68. ).batch(request.data))
  69. class Paragraph(APIView):
  70. authentication_classes = [TokenAuth]
  71. @extend_schema(
  72. summary=_('Get a list of associated paragraphs'),
  73. description=_('Get a list of associated paragraphs'),
  74. operation_id=_('Get a list of associated paragraphs'), # type: ignore
  75. parameters=ProblemParagraphAPI.get_parameters(),
  76. responses=ProblemParagraphAPI.get_response(),
  77. tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore
  78. )
  79. @has_permissions(
  80. PermissionConstants.KNOWLEDGE_PROBLEM_READ.get_workspace_knowledge_permission(),
  81. PermissionConstants.KNOWLEDGE_PROBLEM_READ.get_workspace_permission_workspace_manage_role(),
  82. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  83. ViewPermission([RoleConstants.USER.get_workspace_role()],
  84. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  85. )
  86. def get(self, request: Request, workspace_id: str, knowledge_id: str, problem_id: str):
  87. return result.success(ProblemSerializers.Operate(
  88. data={
  89. **query_params_to_single_dict(request.query_params),
  90. 'workspace_id': workspace_id,
  91. 'knowledge_id': knowledge_id,
  92. 'problem_id': problem_id
  93. }
  94. ).list_paragraph())
  95. class BatchAssociation(APIView):
  96. authentication_classes = [TokenAuth]
  97. @extend_schema(
  98. summary=_('Batch associated paragraphs'),
  99. description=_('Batch associated paragraphs'),
  100. operation_id=_('Batch associated paragraphs'), # type: ignore
  101. request=BatchAssociationAPI.get_request(),
  102. parameters=BatchAssociationAPI.get_parameters(),
  103. responses=BatchAssociationAPI.get_response(),
  104. tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore
  105. )
  106. @has_permissions(
  107. PermissionConstants.KNOWLEDGE_PROBLEM_EDIT.get_workspace_knowledge_permission(),
  108. PermissionConstants.KNOWLEDGE_PROBLEM_EDIT.get_workspace_permission_workspace_manage_role(),
  109. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  110. ViewPermission([RoleConstants.USER.get_workspace_role()],
  111. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  112. )
  113. @log(
  114. menu='problem', operate='Batch associated paragraphs',
  115. get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id')),
  116. )
  117. def put(self, request: Request, workspace_id: str, knowledge_id: str):
  118. return result.success(ProblemSerializers.BatchOperate(
  119. data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
  120. ).association(request.data))
  121. class BatchDelete(APIView):
  122. authentication_classes = [TokenAuth]
  123. @extend_schema(
  124. methods=['PUT'],
  125. summary=_('Batch deletion issues'),
  126. description=_('Batch deletion issues'),
  127. operation_id=_('Batch deletion issues'), # type: ignore
  128. request=BatchDeleteAPI.get_request(),
  129. parameters=BatchDeleteAPI.get_parameters(),
  130. responses=BatchDeleteAPI.get_response(),
  131. tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore
  132. )
  133. @has_permissions(
  134. PermissionConstants.KNOWLEDGE_PROBLEM_EDIT.get_workspace_knowledge_permission(),
  135. PermissionConstants.KNOWLEDGE_PROBLEM_EDIT.get_workspace_permission_workspace_manage_role(),
  136. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  137. ViewPermission([RoleConstants.USER.get_workspace_role()],
  138. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  139. )
  140. @log(
  141. menu='problem', operate='Batch deletion issues',
  142. get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id')),
  143. )
  144. def put(self, request: Request, workspace_id: str, knowledge_id: str):
  145. return result.success(ProblemSerializers.BatchOperate(
  146. data={'knowledge_id': knowledge_id, 'workspace_id': workspace_id}
  147. ).delete(request.data))
  148. class Operate(APIView):
  149. authentication_classes = [TokenAuth]
  150. @extend_schema(
  151. methods=['DELETE'],
  152. summary=_('Delete question'),
  153. description=_('Delete question'),
  154. operation_id=_('Delete question'), # type: ignore
  155. parameters=ProblemDeleteAPI.get_parameters(),
  156. responses=ProblemDeleteAPI.get_response(),
  157. tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore
  158. )
  159. @has_permissions(
  160. PermissionConstants.KNOWLEDGE_PROBLEM_DELETE.get_workspace_knowledge_permission(),
  161. PermissionConstants.KNOWLEDGE_PROBLEM_DELETE.get_workspace_permission_workspace_manage_role(),
  162. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  163. ViewPermission([RoleConstants.USER.get_workspace_role()],
  164. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  165. )
  166. @log(
  167. menu='problem', operate='Delete question',
  168. get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id')),
  169. )
  170. def delete(self, request: Request, workspace_id: str, knowledge_id: str, problem_id: str):
  171. return result.success(ProblemSerializers.Operate(
  172. data={
  173. **query_params_to_single_dict(request.query_params),
  174. 'workspace_id': workspace_id,
  175. 'knowledge_id': knowledge_id,
  176. 'problem_id': problem_id
  177. }
  178. ).delete())
  179. @extend_schema(
  180. methods=['PUT'],
  181. summary=_('Modify question'),
  182. description=_('Modify question'),
  183. operation_id=_('Modify question'), # type: ignore
  184. parameters=ProblemEditAPI.get_parameters(),
  185. request=ProblemEditAPI.get_request(),
  186. responses=ProblemEditAPI.get_response(),
  187. tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore
  188. )
  189. @has_permissions(
  190. PermissionConstants.KNOWLEDGE_PROBLEM_EDIT.get_workspace_knowledge_permission(),
  191. PermissionConstants.KNOWLEDGE_PROBLEM_EDIT.get_workspace_permission_workspace_manage_role(),
  192. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  193. ViewPermission([RoleConstants.USER.get_workspace_role()],
  194. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  195. )
  196. @log(
  197. menu='problem', operate='Modify question',
  198. get_operation_object=lambda r, keywords: get_knowledge_operation_object(keywords.get('knowledge_id')),
  199. )
  200. def put(self, request: Request, workspace_id: str, knowledge_id: str, problem_id: str):
  201. return result.success(ProblemSerializers.Operate(
  202. data={
  203. **query_params_to_single_dict(request.query_params),
  204. 'workspace_id': workspace_id,
  205. 'knowledge_id': knowledge_id,
  206. 'problem_id': problem_id
  207. }
  208. ).edit(request.data))
  209. class Page(APIView):
  210. authentication_classes = [TokenAuth]
  211. @extend_schema(
  212. summary=_('Get the list of questions by page'),
  213. description=_('Get the list of questions by page'),
  214. operation_id=_('Get the list of questions by page'), # type: ignore
  215. parameters=ProblemPageAPI.get_parameters(),
  216. responses=ProblemPageAPI.get_response(),
  217. tags=[_('Knowledge Base/Documentation/Paragraph/Question')] # type: ignore
  218. )
  219. @has_permissions(
  220. PermissionConstants.KNOWLEDGE_PROBLEM_READ.get_workspace_knowledge_permission(),
  221. PermissionConstants.KNOWLEDGE_PROBLEM_READ.get_workspace_permission_workspace_manage_role(),
  222. PermissionConstants.KNOWLEDGE_DOCUMENT_READ.get_workspace_knowledge_permission(),
  223. PermissionConstants.KNOWLEDGE_DOCUMENT_READ.get_workspace_permission_workspace_manage_role(),
  224. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
  225. ViewPermission([RoleConstants.USER.get_workspace_role()],
  226. [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND),
  227. )
  228. def get(self, request: Request, workspace_id: str, knowledge_id: str, current_page, page_size):
  229. d = ProblemSerializers.Query(
  230. data={
  231. **query_params_to_single_dict(request.query_params),
  232. 'knowledge_id': knowledge_id,
  233. 'workspace_id': workspace_id
  234. }
  235. )
  236. d.is_valid(raise_exception=True)
  237. return result.success(d.page(current_page, page_size))