html_document_controller.py 7.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. # coding=utf-8
  2. import typing
  3. import transaction
  4. from pyramid.config import Configurator
  5. from tracim_backend.models.data import UserRoleInWorkspace
  6. try: # Python 3.5+
  7. from http import HTTPStatus
  8. except ImportError:
  9. from http import client as HTTPStatus
  10. from tracim_backend.lib.utils.request import TracimRequest
  11. from tracim_backend.extensions import hapic
  12. from tracim_backend.lib.core.content import ContentApi
  13. from tracim_backend.views.controllers import Controller
  14. from tracim_backend.views.core_api.schemas import TextBasedContentSchema
  15. from tracim_backend.views.core_api.schemas import TextBasedRevisionSchema
  16. from tracim_backend.views.core_api.schemas import TextBasedContentModifySchema
  17. from tracim_backend.views.core_api.schemas import SetContentStatusSchema
  18. from tracim_backend.views.core_api.schemas import WorkspaceAndContentIdPathSchema
  19. from tracim_backend.views.core_api.schemas import NoContentSchema
  20. from tracim_backend.lib.utils.authorization import require_content_types
  21. from tracim_backend.lib.utils.authorization import require_workspace_role
  22. from tracim_backend.exceptions import EmptyLabelNotAllowed
  23. from tracim_backend.models.context_models import ContentInContext
  24. from tracim_backend.models.context_models import RevisionInContext
  25. from tracim_backend.app_models.contents import CONTENT_TYPES
  26. from tracim_backend.app_models.contents import HTML_DOCUMENTS_TYPE
  27. from tracim_backend.models.revision_protection import new_revision
  28. SWAGGER_TAG__HTML_DOCUMENT_ENDPOINTS = 'HTML documents'
  29. class HTMLDocumentController(Controller):
  30. @hapic.with_api_doc(tags=[SWAGGER_TAG__HTML_DOCUMENT_ENDPOINTS])
  31. @require_workspace_role(UserRoleInWorkspace.READER)
  32. @require_content_types([HTML_DOCUMENTS_TYPE])
  33. @hapic.input_path(WorkspaceAndContentIdPathSchema())
  34. @hapic.output_body(TextBasedContentSchema())
  35. def get_html_document(self, context, request: TracimRequest, hapic_data=None) -> ContentInContext: # nopep8
  36. """
  37. Get html document content
  38. """
  39. app_config = request.registry.settings['CFG']
  40. api = ContentApi(
  41. show_archived=True,
  42. show_deleted=True,
  43. current_user=request.current_user,
  44. session=request.dbsession,
  45. config=app_config,
  46. )
  47. content = api.get_one(
  48. hapic_data.path.content_id,
  49. content_type=CONTENT_TYPES.Any_SLUG
  50. )
  51. return api.get_content_in_context(content)
  52. @hapic.with_api_doc(tags=[SWAGGER_TAG__HTML_DOCUMENT_ENDPOINTS])
  53. @hapic.handle_exception(EmptyLabelNotAllowed, HTTPStatus.BAD_REQUEST)
  54. @require_workspace_role(UserRoleInWorkspace.CONTRIBUTOR)
  55. @require_content_types([HTML_DOCUMENTS_TYPE])
  56. @hapic.input_path(WorkspaceAndContentIdPathSchema())
  57. @hapic.input_body(TextBasedContentModifySchema())
  58. @hapic.output_body(TextBasedContentSchema())
  59. def update_html_document(self, context, request: TracimRequest, hapic_data=None) -> ContentInContext: # nopep8
  60. """
  61. update_html_document
  62. """
  63. app_config = request.registry.settings['CFG']
  64. api = ContentApi(
  65. show_archived=True,
  66. show_deleted=True,
  67. current_user=request.current_user,
  68. session=request.dbsession,
  69. config=app_config,
  70. )
  71. content = api.get_one(
  72. hapic_data.path.content_id,
  73. content_type=CONTENT_TYPES.Any_SLUG
  74. )
  75. with new_revision(
  76. session=request.dbsession,
  77. tm=transaction.manager,
  78. content=content
  79. ):
  80. api.update_content(
  81. item=content,
  82. new_label=hapic_data.body.label,
  83. new_content=hapic_data.body.raw_content,
  84. )
  85. api.save(content)
  86. return api.get_content_in_context(content)
  87. @hapic.with_api_doc(tags=[SWAGGER_TAG__HTML_DOCUMENT_ENDPOINTS])
  88. @require_workspace_role(UserRoleInWorkspace.READER)
  89. @require_content_types([HTML_DOCUMENTS_TYPE])
  90. @hapic.input_path(WorkspaceAndContentIdPathSchema())
  91. @hapic.output_body(TextBasedRevisionSchema(many=True))
  92. def get_html_document_revisions(
  93. self,
  94. context,
  95. request: TracimRequest,
  96. hapic_data=None
  97. ) -> typing.List[RevisionInContext]:
  98. """
  99. get html_document revisions
  100. """
  101. app_config = request.registry.settings['CFG']
  102. api = ContentApi(
  103. show_archived=True,
  104. show_deleted=True,
  105. current_user=request.current_user,
  106. session=request.dbsession,
  107. config=app_config,
  108. )
  109. content = api.get_one(
  110. hapic_data.path.content_id,
  111. content_type=CONTENT_TYPES.Any_SLUG
  112. )
  113. revisions = content.revisions
  114. return [
  115. api.get_revision_in_context(revision)
  116. for revision in revisions
  117. ]
  118. @hapic.with_api_doc(tags=[SWAGGER_TAG__HTML_DOCUMENT_ENDPOINTS])
  119. @require_workspace_role(UserRoleInWorkspace.CONTRIBUTOR)
  120. @require_content_types([HTML_DOCUMENTS_TYPE])
  121. @hapic.input_path(WorkspaceAndContentIdPathSchema())
  122. @hapic.input_body(SetContentStatusSchema())
  123. @hapic.output_body(NoContentSchema(), default_http_code=HTTPStatus.NO_CONTENT) # nopep8
  124. def set_html_document_status(
  125. self,
  126. context,
  127. request: TracimRequest,
  128. hapic_data=None
  129. ) -> None:
  130. """
  131. set html_document status
  132. """
  133. app_config = request.registry.settings['CFG']
  134. api = ContentApi(
  135. show_archived=True,
  136. show_deleted=True,
  137. current_user=request.current_user,
  138. session=request.dbsession,
  139. config=app_config,
  140. )
  141. content = api.get_one(
  142. hapic_data.path.content_id,
  143. content_type=CONTENT_TYPES.Any_SLUG
  144. )
  145. with new_revision(
  146. session=request.dbsession,
  147. tm=transaction.manager,
  148. content=content
  149. ):
  150. api.set_status(
  151. content,
  152. hapic_data.body.status,
  153. )
  154. api.save(content)
  155. return
  156. def bind(self, configurator: Configurator) -> None:
  157. # Get html-document
  158. configurator.add_route(
  159. 'html_document',
  160. '/workspaces/{workspace_id}/html-documents/{content_id}',
  161. request_method='GET'
  162. )
  163. configurator.add_view(self.get_html_document, route_name='html_document') # nopep8
  164. # update html-document
  165. configurator.add_route(
  166. 'update_html_document',
  167. '/workspaces/{workspace_id}/html-documents/{content_id}',
  168. request_method='PUT'
  169. ) # nopep8
  170. configurator.add_view(self.update_html_document, route_name='update_html_document') # nopep8
  171. # get html document revisions
  172. configurator.add_route(
  173. 'html_document_revisions',
  174. '/workspaces/{workspace_id}/html-documents/{content_id}/revisions', # nopep8
  175. request_method='GET'
  176. )
  177. configurator.add_view(self.get_html_document_revisions, route_name='html_document_revisions') # nopep8
  178. # get html document revisions
  179. configurator.add_route(
  180. 'set_html_document_status',
  181. '/workspaces/{workspace_id}/html-documents/{content_id}/status', # nopep8
  182. request_method='PUT'
  183. )
  184. configurator.add_view(self.set_html_document_status, route_name='set_html_document_status') # nopep8